package com.jm.cloud.web.config;

import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * tide
 * <p>
 * Swagger 接口文档配置类
 * <p>
 * author: jiangjianmin
 * <p>
 * create: 2024-08-22 13:31
 **/
@Slf4j
@Configuration
@EnableOpenApi
public class SwaggerConfiguration {
    /**
     * 应用服务名
     */
    @Value("${spring.application.name}")
    private String applicationName;

    /**
     * 创建Swagger2 API文档
     *
     * @return 返回配置好的Docket实例
     *
     * 通过@Bean注解将Docket配置类实例化为Spring Boot应用上下文中的一个Bean，
     * 这样Spring Boot应用在启动时会自动创建并初始化Docket实例，
     * 从而启用Swagger2 API文档功能
     */
    @Bean
    public Docket createRestApi() {
        // 创建Docket实例，指定API文档的类型为OAS 3.0
        return new Docket(DocumentationType.OAS_30)
                // 添加API信息，如标题、描述等
                .apiInfo(apiInfo())
                // 指定要扫描的API范围
                .select()
                // 选择包含@Api注解的类的API
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                // 对所有路径进行扫描
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 构建API的基本信息对象
     *
     * 该方法使用ApiInfoBuilder模式来构建一个包含API标题、描述、联系信息和版本的ApiInfo对象
     * 这些信息主要用于Swagger UI的展示和元数据描述，便于开发者理解和使用API
     *
     * @return ApiInfo 构建并返回ApiInfo对象，包含了API的基本信息
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(applicationName)
                .description(applicationName + "接口文档。")
                .contact(new Contact("潮汐框架", "", ""))
                .version("1.0")
                .build();
    }


}
